package com.sap.sap_mangers.mapper;

import com.sap.sap_mangers.Vo.JoinVo.JoinManagerVo;
import com.sap.sap_mangers.pojo.SapJoinApplication;
import com.sap.sap_mangers.pojo.SapJoinManager;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 新生入会(升级会员) mapper
 *
 * @author ZhouKai
 * 2022/8/22 22:43
 */
@Mapper
public interface JoinMapper {

    /**
     * 清空入会管理员表
     */
    void clearJoinManagerTable();

    /**
     * 填充入会管理员表
     *
     * @param list 管理层人员学号集合
     */
    void fillJoinManagerTable(List<String> list);

    /**
     * 调整管理员是否负责管理
     *
     * @param username    学号
     * @param responsible 是否负责管理
     */
    void updateResponsible(@Param("username") String username, @Param("responsible") Boolean responsible);

    /**
     * 根据学号获取管理员表信息
     *
     * @param username 学号
     * @return 管理员表实体类
     */
    SapJoinManager getSapJoinManager(@Param("username") String username);

    /**
     * 获取所有入会管理员信息
     *
     * @return 管理员表实体类列表
     */
    List<SapJoinManager> getAllSapJoinManagers();

    /**
     * 获取所有负责管理并且上传了至少一种付款码的负责人信息
     * (responsible==true并且付款码cos地址至少一个不为空)
     *
     * @return 管理员表实体类列表
     */
    List<SapJoinManager> getAllResponsibleSapJoinManagers();

    /**
     * 设置微信收款码(cos地址)
     *
     * @param username       管理员学号
     * @param collectionCode 微信收款码cos地址
     */
    void setWeChatCollectionCode(@Param("username") String username, @Param("collectionCode") String collectionCode);

    /**
     * 设置支付宝收款码(cos地址)
     *
     * @param username       管理员学号
     * @param collectionCode 支付宝收款码cos地址
     */
    void setAlipayCollectionCode(@Param("username") String username, @Param("collectionCode") String collectionCode);

    /**
     * 获取入会申请记录
     *
     * @param username 申请人学号
     * @return 入会申请记录表记录
     */
    SapJoinApplication getSapJoinApplication(@Param("username") String username);

    /**
     * 判断邀请码是否已存在
     * (有效数据中不能存在相同的邀请码，过期记录和已完成的记录不考虑)
     *
     * @param invitationCode 生成的邀请码
     * @return 查询到的邀请码(为null表示不存在)
     */
    String whetherTheInvitationCodeExist(@Param("invitationCode") String invitationCode);

    /**
     * 添加入会申请记录数据
     *
     * @param application 入会申请表实体类
     */
    void addSapJoinApplication(@Param("application") SapJoinApplication application);

    /**
     * 增加入会管理员表对应管理员'负责管理的人数'字段的值 (+1)
     *
     * @param username 学号
     */
    void increaseManagementNumber(@Param("username") String username);

    /**
     * 减小对应管理员‘负责管理的人数’ (-1)
     *
     * @param username 学号
     */
    void decreaseManagementNumber(@Param("username") String username);

    /**
     * 重置入会申请记录数据
     * (申请记录已过期时重置记录，不会insert新数据项，会重置所有信息)
     * sql中where语句通过join_application_id查找，上传的申请表实体类对象要保证是通过数据库查找获取再修改具体字段内容
     *
     * @param application 入会申请表实体类 (通过数据库查找获取再修改具体字段内容,保证有原数据项的编号信息)
     */
    void createSapJoinApplicationAgain(@Param("application") SapJoinApplication application);

    /**
     * 设置转账单号 (填写/修改)
     *
     * @param joinApplicationId     申请记录编号
     * @param paymentTransferNumber 转账单号
     */
    void setJoinApplicationPaymentTransferNumber(@Param("joinApplicationId") Integer joinApplicationId, @Param("paymentTransferNumber") String paymentTransferNumber);

    /**
     * 通过邀请码获取申请记录
     *
     * @param invitationCode 邀请码
     * @return 申请记录实体类
     */
    SapJoinApplication getSapJoinApplicationByCode(@Param("invitationCode") String invitationCode);

    /**
     * 修改申请表 ‘是否审核完成字段’ 0：未完成 1：已完成
     *
     * @param username 学号
     * @param result   0：未完成 1：已完成
     */
    void updateJoinApplicationResult(@Param("username") String username, @Param("result") int result);

    /**
     * 检测过期的记录，将join_lapse字段改为1
     * <p>
     * 入会申请记录的create_time字段在每次点击申请按钮时都会刷新，填写过转账单号的记录不会过期
     * 检测create_time字段到当前时间大于24h的未填写单号的未过期记录，将其对应join_lapse字段改为1标识已过期
     */
    void detectExpiredJoinApplicationRecords();

    /**
     * 更新记录表create_time字段
     *
     * @param username 申请人学号
     */
    void updateCreateTime(@Param("username") String username);

    /**
     * 查询所有管理员的信息视图
     *
     * @return 管理员信息视图
     */
    List<JoinManagerVo> getJoinManagerVos();

    /**
     * 查询异常的申请记录 (填写了单号但未成功处理) -> 填写了转账单号的记录不会过期，系统审核通过才算处理成功
     *
     * @return 填写了单号但未成功处理的申请记录 (不排除单号是乱填的的可能)
     */
    List<SapJoinApplication> getAbnormalJoinApplication();

    /**
     * 清空填写的转账单号
     *
     * @param username 申请人学号
     */
    void clearJoinApplicationPaymentTransferNumber(@Param("useranme") String username);

    /**
     * 根据管理员获取其负责的、提交了单号的入会记录
     *
     * @param managerUsername 管理员学号
     * @return 管理员负责的、提交了单号的入会记录
     */
    List<SapJoinApplication> getSubmittedJoinApplicationByManager(@Param("managerUsername") String managerUsername);
}
